
local tokens_key = KEYS[1] --令牌桶剩余令牌数  redis的key（键名）
local timestamp_key = KEYS[2] --令牌桶最后填充令牌时间  redis的key（键名）
--redis.log(redis.LOG_WARNING, "tokens_key " .. tokens_key)

local rate = tonumber(ARGV[1]) --入参1  速率

local capacity = tonumber(ARGV[2]) --入参2 容量
local now = tonumber(ARGV[3]) --入参3 开始的时间
local requested = tonumber(ARGV[4]) --入参4 消耗令牌桶数量  默认1


  --return {rate,capacity,now,requested}

local fill_time = capacity/rate --计算令牌桶填充满令牌需要多久时间，单位：秒

local ttl = math.floor(fill_time*2) --ttl 剩余生存时间 TIMEOUT


local last_tokens = tonumber(redis.call("get", tokens_key)) --令牌桶剩余令牌数

if last_tokens == nil then
  last_tokens = capacity
end

local last_refreshed = tonumber(redis.call("get", timestamp_key)) --令牌桶最后填充令牌时间
if last_refreshed == nil then
  last_refreshed = 0
end

local delta = math.max(0, now-last_refreshed)

--[[local filled_tokens = math.min(capacity, last_tokens+(delta*rate))--令牌桶剩余令牌数 原来脚本怀疑有错，改成下面的]]
local filled_tokens = math.min(capacity, last_tokens+(delta/1000*rate))--令牌桶剩余令牌数
local last = last_tokens+(delta*rate)
local allowed = filled_tokens >= requested
local new_tokens = filled_tokens --令牌桶剩余令牌数
local allowed_num = 0 --获取令牌数量  0失败 1成功

if allowed then
  new_tokens = filled_tokens - requested
  allowed_num = 1
end
redis.call("setex", tokens_key, ttl, new_tokens)
redis.call("setex", timestamp_key, ttl, now)
return { allowed_num, new_tokens ,last_tokens ,allowed,filled_tokens,requested,delta,last}


